package LC.demo;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class demo02 {
    //    static int[] arr01 = {11, 22, 33, 24, 55, 56, 56};
//    static int[] arr02 = {56, 56, 56, 56, 56, 56, 56};
    static int[] arr = new int[100000];
    static Random r = new Random();

    public static void main(String[] args) {

        // 采用随机数给数组的每一个元素赋值
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(100) + 1;
        }

        // 数组的遍历
//        System.out.print("[");
//        for (int i = 0; i < arr.length; i++) {
//            if (i == arr.length - 1) {
//                System.out.println(arr[i] + "]");
//            } else {
//                System.out.print(arr[i] + ", ");
//            }
//        }


        //俩次迭代的方式
        long startTimegetSecondBiggestNum = System.currentTimeMillis();    //获取开始时间
        System.out.println(getSecondBiggestNum(arr));
        long endTimegetSecondBiggestNum = System.currentTimeMillis();    //获取结束时间
        System.out.println("程序运行时间：" + (endTimegetSecondBiggestNum - startTimegetSecondBiggestNum) + "ms");    //输出程序运行时间

        //第二种方式：for if + 过滤的形式
        long startTimegetSecondBiggest = System.currentTimeMillis();    //获取开始时间
        System.out.println(getSecondBiggest(arr));
        long endTimegetSecondBiggest = System.currentTimeMillis();    //获取结束时间
        System.out.println("程序运行时间：" + (endTimegetSecondBiggest - startTimegetSecondBiggest) + "ms");    //输出程序运行时间

        System.out.println(getOneAndSecondBiggestNum(arr));

    }

    /**
     * @param arr
     * @return
     */
    public static int getBiggestNum(int[] arr) {
        int biggestNum = arr[0];
        //第一轮迭代求最大值
        for (int i = 0; i < arr.length; i++) {
            if (biggestNum < arr[i])
                biggestNum = arr[i];
        }
        return biggestNum;
    }

    /**
     * @param arr
     * @return
     */
    public static int getSecondBiggestNum(int[] arr) {
        int temp = 0;
        int biggestNum = arr[0];
        //第一轮迭代求最大值
        for (int i = 0; i < arr.length; i++) {
            if (biggestNum < arr[i])
                biggestNum = arr[i];
        }
        //第二轮迭代求第二大值
        for (int i = 0; i < arr.length; i++) {
            if (temp < arr[i] && arr[i] != biggestNum) {
                temp = arr[i];
            }
        }
        //全部相同
        if (temp == 0 || arr[0] == arr[1]) {
            return arr[0];
        }
        return temp;
    }

    /**
     * @param arr
     * @return
     */
    public static Map<String, Integer> getOneAndSecondBiggestNum(int[] arr) {
        HashMap<String, Integer> integerIntegerHashMap = new HashMap<>();
        // 第一大的数  第二大的数
        int a1 = 0;
        int a2 = 0;
        for (int i = 0, len = arr.length; i < len; i++) {
            // 第一大的数 & 第二大的数
            if (arr[i] > a1) {
                a2 = a1;
                a1 = arr[i];
                continue;
            }
            // 第二大的数
            // arr[i] != a1 过滤最大数重复的情况
            if (arr[i] > a2 && arr[i] != a1) {
                a2 = arr[i];
            }
        }
        //全部相同
        if (a1 == 0 || arr[0] == arr[1]) {
            a1 = arr[0];
            a2 = arr[0];
        }

        integerIntegerHashMap.put("one", a1);
        integerIntegerHashMap.put("two", a2);
        return integerIntegerHashMap;
    }

    /**
     * @param arr
     * @return
     */
    public static int getSecondBiggest(int[] arr) {
        // 第一大的数  第二大的数
        int a1 = 0;
        int a2 = 0;
        for (int i = 0, len = arr.length; i < len; i++) {
            // 第一大的数 & 第二大的数
            if (arr[i] > a1) {
                a2 = a1;
                a1 = arr[i];
                continue;
            }
            // 第二大的数
            // arr[i] != a1 过滤最大数重复的情况
            if (arr[i] > a2 && arr[i] != a1) {
                a2 = arr[i];
            }
        }
        //全部相同
        if (a1 == 0 || arr[0] == arr[1]) {
            a1 = arr[0];
            a2 = arr[0];
        }
        return a2;
    }

}


